#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

struct PersonInfo
{
    string name;
    vector<string> phones;
};
bool valid(const string&);
string format(const string &);

int main()
{
    string line, word; // 分别保存来自输入的一行和单词
    vector<PersonInfo> people; // 保存来自输入的所有记录
    // 逐行从输入读取数据，直到 cin遇到文件尾（或其他错误）
    while (getline(cin, line)) {
        PersonInfo info;  // 创建一个保存此记录数据的对象
        istringstream record(line);  // 将记录绑定到刚读入的行
        record >> info.name;  // 读取名字
        while (record >> word) {  // 读取电话号码
            info.phones.push_back(word);  // 保存号码
        }
        people.push_back(info);  // 将此记录追加到 people末尾
    }

    for (const auto &entry : people) {  // 对 people中的每一项
        ostringstream formatted, badNums;  // 每个循环步创建的对象
        for (const auto &nums : entry.phones) {  // 对每个号码
            if (!valid(nums)) {
                badNums << " " << nums; // 将数的字符串形式存入 badNums;
            } else {
                // 将格式化的字符串写入 formatted
                formatted << " " << format(nums);
            }
        }
        if (badNums.str().empty()) { // 没有错误的字
            cout << entry.name << " " << formatted.str() << endl;  // 打印名字和格式化电话
        } else {  // 否则打印名字和错误的号码
            cerr << "input error: " << entry.name
                 << " invalid number(s): " << badNums.str() << endl;
        }
    }
    return 0;
}
